home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / tosfixes / hsmoda05.lzh / HSM_DOKU / SERSOFST.TXT < prev   
Text File  |  1994-10-24  |  35KB  |  790 lines

  1. Festlegung einer Softwareschnittstelle, die eine vollständig
  2. hardwareunabhängige Nutzung serieller Interfaces ermöglicht
  3. ============================================================
  4.  
  5. Definition of a software interface, providing a fully hardware
  6. independend use of serial interfaces
  7. ==============================================================
  8. This file contains the english version too, begin to search at the 
  9. middle of the text.
  10.  
  11.  
  12. Text von: Harun Scheutzow, Dresdener Straße 83, D-10179 Berlin
  13. Internet-Email: Harun_Scheutzow@B.maus.de
  14. letzte Änderung der Definition: 12.11.1993
  15. letzte Änderung der Erklärungen: 24.10.1994
  16.  
  17. Es sollen möglichst alle Funktionen definiert werden, die ein 
  18. Terminalprogramm, ein Übertragungsprotokoll oder z.B. ein Faxprogramm 
  19. benötigt. Diese Funktionen sollen ein hardwareunabhängiges Interface für 
  20. Programme darstellen.
  21.  
  22. Dieser Vorschlag ist Eric Smith bekannt. Es ist (noch?) KEIN 
  23. offizieller Atari-Standard. Eric findet den Vorschlag gut (nur die 
  24. Callbacks hält er bezüglich Memory Protection für nicht so toll) und 
  25. meint: Es ist besser, einen inoffiziellen Standard zu haben, als gar 
  26. keinen. Originalton im englischen Teil.
  27.  
  28. MiNT oder TOS oder ein nachzuladender Treiber sollen möglichst viele der 
  29. hier beschriebenen Funktionen unterstützen, soweit es die Hardware zuläßt. 
  30. Es muß aber jede Soft damit rechnen, daß eine Funktion nicht existiert 
  31. (Rückmeldung EINVFN, -32). Verhindert dies die Arbeit der Soft, so muß der 
  32. Nutzer darüber informiert werden.
  33.  
  34. Dies hier ist ein Standardisierungsversuch für das Interface, daß 
  35. Nutzerprogramme vorfinden. Über die Interna der Treiberimplementation soll 
  36. nichts geschrieben werden. Bei allen Funktionen und Vorschlägen muß aber 
  37. daran gedacht werden, daß diese auch auf einem 68000 mit 8MHz bei 38400Bd 
  38. über den MFP (also ohne FIFO) realisierbar sind. Die steigende Leistung der 
  39. CPUs ist kein Argument, da die gewünschte Datentransferrate auch ständig 
  40. steigt.
  41.  
  42.  
  43. Fopen, Fread, Fwrite, Fclose dürften als normale GEMDOS-Funktionen jedem
  44. bekannt sein. Fcntl ist die im MiNT (und in HSMODEM) vorhandene GEMDOS-Funktion
  45. $104, mit LONG Fcntl( WORD filehandle, LONG special, WORD subfunction). Fcntl
  46. liefert meist eine 0 als OK-Meldung, oder sonst einen Fehlercode. Irgendwelche
  47. abgefragten Werte werden üblicherweise nicht als Returncode von Fcntl
  48. geliefert, sondern auf einer Speicherstelle, auf die special zeigt.
  49.  
  50. Die Reservierung einer Schnittstelle will ich über den Öffnungsmodus von Fopen 
  51. realisieren.
  52.  
  53.  
  54.  
  55. Hier ein Versuch der Dokumentation, was MiNT bereits bieten soll. 
  56. Allerdings sind in MiNT nicht alle Funktionen vorhanden oder funktionieren 
  57. nicht ganz, wie sie sollten. 
  58.  
  59.  
  60. Manche Zeilen sind C, manche Kommentar. Bei den angegebenen 
  61. Funktionsaufrufen handelt es sich wirklich um Musteraufrufe, und nicht etwa 
  62. um mißgestaltete Prototypen.
  63.  
  64.  
  65.  
  66. Ermittlung, wieviel Byte nichtblockierend übertragen werden können
  67. ------------------------------------------------------------------
  68. #define FIONREAD  (('F'<< 8) | 1)
  69. #define FIONWRITE (('F'<< 8) | 2)
  70. Fcntl( handle, &count, FIONREAD)
  71. Fcntl( handle, &count, FIONWRITE)
  72. In count wird als 32Bit-Wert die Anzahl der Byte hinterlassen, die beim 
  73. nächsten Fread/Fwrite mindestens gelesen/geschrieben werden können. Da aber 
  74. möglicherweise mehrere Programme auf einen Port schreiben könnten, sollte 
  75. man nur den Returnwert von Fread/Fwrite für voll nehmen.
  76.  
  77.  
  78. Setzen und Rücksetzen von Break
  79. -------------------------------
  80. #define TIOCCBRK (('T'<< 8) | 20)
  81. #define TIOCSBRK (('T'<< 8) | 21)
  82. Fcntl( handle, dummy, TIOCSBRK); /* Break aktivieren */
  83. Fcntl( handle, dummy, TIOCCBRK); /* Break löschen */
  84.  
  85.  
  86. Setzen/Abfragen der Eingabegeschwindigkeit und Steuerung der DTR-Leitung
  87. ------------------------------------------------------------------------
  88. #define TIOCIBAUD (('T'<< 8) | 18)
  89. Fcntl( handle, &speed, TIOCIBAUD);
  90. Setze die Eingabegeschwindigkeit der Schnittstelle. In speed steht ein 
  91. 32Bit-Wert, der die gewünschte Geschwindigkeit unkodiert in Bit pro Sekunde 
  92. angibt. speed = 19200 würde auf 19200bps setzen. In speed wird die 
  93. Geschwindigkeit vor dem Aufruf von TIOCIBAUD zurückgegeben. Ist sie 
  94. unbekannt, wird -1 geliefert. Ist beim Aufruf speed = -1, so wird nur die 
  95. Geschwindigkeit erfragt. Ist speed = 0, so wird das DTR-Signal auf inaktiv 
  96. gebracht (gelöscht), ohne die Geschwindigkeit zu beeinflussen. Bei 
  97. geschwindigkeitssetzendem Aufruf wird DTR automatisch aktiviert. 
  98. Rückgabewert ist ERANGE wenn die Geschwindigkeit nicht einstellbar ist. 
  99. Dann wird als "Ausnahme" in speed die nächstniedrigere mögliche 
  100. Geschwindigkeit geliefert. Gibt es keine nächstniedrige, so wird die 
  101. kleinstmögliche zurückgegeben.
  102.  
  103.  
  104. Setzen/Abfragen der Ausgabegeschwindigkeit und Steuerung der DTR-Leitung 
  105. ------------------------------------------------------------------------
  106. #define TIOCOBAUD (('T'<< 8) | 19) Fcntl( handle, &speed, TIOCOBAUD);
  107. Setze die Ausgabegeschwindigkeit der Schnittstelle. Die 
  108. Funktionsbeschreibung ist identisch zu TIOCIBAUD. Unterstützt eine 
  109. Schnittstelle getrennte Ein- und Ausgabegeschwindigkeit nicht, so 
  110. beeinflußt jeder Aufruf beide Geschwindigkeiten.
  111.  
  112.  
  113. Übertragungsprotokolleinstellungen erfragen
  114. -------------------------------------------
  115. #define TIOCGFLAGS (('T'<< 8) | 22)
  116. Fcntl( handle, &flags, TIOCGFLAGS);
  117. Liefert in flags einen 16Bit-Wert der eingestellten Parameter, die eine 
  118. ODER-Verknüpfung der folgenden Werte darstellen. Alle anderen Bit sind 
  119. reserviert. Bei TIOCGFLAGS sollte man sie ignorieren. Sinnvollerweise 
  120. erfragt man mit TIOCGFLAGS, modifiziert die bekannten Werte, und setzt dann 
  121. per TIOCSFLAGS.
  122.  
  123. /* Anzahl der Stoppbits */
  124. #define TF_STOPBITS 0x0003
  125. /* 0x0000  nicht erlaubt
  126. ERWEITERUNGSVORSCHLAG: So wird der Synchronmode aktiviert. Die restlichen 
  127. Parameter erhalten im Synchronmode andere Bedeutungen. Diese sind später 
  128. noch festzulegen. */
  129. #define TF_1STOP   0x0001 /* 1 Stoppbit */
  130. #define TF_15STOP  0x0002 /* 1.5 Stoppbit */
  131. #define    TF_2STOP   0x0003 /* 2 Stoppbit */
  132.  
  133. /* Anzahl der Bits pro Zeichen */
  134. #define TF_CHARBITS 0x000C
  135. #define TF_8BIT    0x0 /* 8 Bit */
  136. #define TF_7BIT    0x4
  137. #define TF_6BIT    0x8
  138. #define TF_5BIT    0xC /* 5 Bit */
  139.  
  140. /* Handshakemodi und Parität */
  141. #define TF_FLAG  0xF000
  142. #define T_TANDEM 0x1000 /* XON/XOFF (=^Q/^S) Flußkontrolle aktiv */
  143. #define T_RTSCTS 0x2000 /* RTS/CTS Flußkontrolle aktiv */
  144. #define T_EVENP  0x4000 /* even (gerade) Parität aktiv */
  145. #define T_ODDP   0x8000 /* odd (ungerade) Parität aktiv */
  146. /* even und odd schließen sich gegenseitig aus */
  147.  
  148.  
  149. Übertragungsprotokolleinstellungen setzen
  150. -----------------------------------------
  151. #define TIOCSFLAGS (('T'<< 8) | 23)
  152. Fcntl( handle, &flags, TIOCSFLAGS);
  153. Setzt die Einstellungen, Beschreibung dieser bei TIOCGFLAGS. Rückgabewert 
  154. ist ERANGE bei illegaler oder nicht unterstützer Kombination in flags.
  155.  
  156.  
  157. Hier endet die Dokumentattion der mir bekannten und verständlichen Funktionen in 
  158. MiNT. Es folgen die neuen Vorschläge.
  159.  
  160.  
  161. Leeren der seriellen Puffer
  162. ---------------------------
  163. #define TIOCFLUSH (('T'<< 8) | 8)
  164. Fcntl( handle, special, TIOCFLUSH);
  165. (ist doch im Mint "/* BUG: this should flush the input/output buffers */")
  166. Auswählbar über den special-Parameter werden die seriellen Puffer 
  167. unterschiedlich geleert:
  168. special  Funktion
  169. 0
  170.          Der Sendepuffer soll komplett gesendet werden. Die Funktion kehrt 
  171.          erst zurück, wenn der Puffer leer ist (return E_OK, =0) oder ein 
  172.          systeminterner Timeout abgelaufen ist (return EDRVNR, =-2). Der 
  173.          Timeout wird vom System sinnvoll bestimmt.
  174. 1
  175.          Der Empfangspuffer wird gelöscht.
  176. 2
  177.          Der Sendepuffer wird gelöscht.
  178. 3
  179.          Empfangspuffer und Sendepuffer werden gelöscht.
  180. -tout
  181.          Ein negativer Parameter funktioniert wie 0, aber tout (man 
  182.          beachte, tout selbst ist positiv) gibt den Timeout in 1/200 
  183.          Sekunden vor.
  184.  
  185.  
  186. Stoppen des Empfangs
  187. --------------------
  188. #define TIOCSTOP (('T'<< 8) | 9)
  189. Ist nur in den Handshakemodi verfügbar und teilt dem Kommunikationspartner 
  190. mit, daß der Rechner